global generar_codigo
;int generar_codigo ( nodo_arbol_t *a, nodo_arbol_t *h, codigo_t *c)

extern malloc

%define p_arbol ebp+8
%define p_hoja ebp+12
%define p_codigo ebp+16

%define offset_simbolo 0
%define offset_apariciones 1
%define offset_valido 5
%define offset_p_padre	9 
%define offset_p_izq	13
%define offset_p_der	17
%define null 0
%define offset_p_arbol 0
%define offset_siguiente 4

%define offset_codigo 0
%define offset_codigo_rev 4
%define offset_long_codigo 8
%define offset_codigo_t_valido 12

%define mascara_revertido 80000000h
%define ok 1
%define mal 0

section .text

generar_codigo:

	;enter 0,0	;comentado para probar con valgrind
	push ebp
	mov ebp,esp
	
	push ebx
	push esi
	push edi
		
	;mov ebx,p_arbol
	
	mov esi,[p_hoja]
	mov edi,[p_codigo]
	xor ecx, ecx ; longitud del codigo
	xor eax, eax ; codigo revertido 
	xor ebx,ebx ; buffer del codigo 
	
	cmp dword [esi+offset_p_padre],null ; el arbol tiene solo un nodo.
	je _soloUnNodo
	

_recorrerArbol:
	mov edx, [esi+offset_p_padre]
	cmp edx, null
	je _setCodigo
		
	inc ecx
	cmp ecx,32
	jg _error

	shl eax,1
	shr ebx,1; suponemos que es derecho, si no lo es lo modificamos debajo.
	
		
	
	cmp [edx+offset_p_izq],esi
	jne _continuar
	
	; era izquierdo, lo seteamos como tal.
	inc eax		; cambio el ultimo bit de 0 a 1
	or ebx, mascara_revertido	
	
_continuar:
	mov esi,edx
	jmp _recorrerArbol
	
	
	
_setCodigo:
	mov dword [edi+offset_codigo_rev],eax ;codigo revertido	
	mov dword [edi+offset_long_codigo],ecx
	
	mov eax,ecx
	mov ecx,32
	sub ecx,eax
	 
	shr ebx,cl
	
	mov dword [edi+offset_codigo],ebx
	mov dword [edi+offset_codigo_t_valido],1
	
	mov eax, ok
	jmp fin
	

_soloUnNodo:
	mov dword [edi+offset_long_codigo], 1
	mov dword [edi+offset_codigo_t_valido], 1
	jmp fin

_error:
	mov dword [edi+offset_codigo_t_valido], 0
	mov eax, mal
	
	
		
fin:
	
	pop edi
	pop esi
	pop ebx
	leave
	ret
	
